/**
 * Created by haoran.shu on 2017/12/15.
 */
const router = new require('koa-router')();
const bcrypt = require('bcrypt');
const saltRounds = 10; // hash salt
const mongo = require('../dbs/mongodb');
const logger = require('log4js').getLogger('index');
const utils = require('../utils/utils');
const tlssms = require('../utils/tlssms');

async function insertCode() {
  // 1. 生成验证码
  let c = utils.random(4);
  // 2. 验证生成的验证码是否有效[数据库中是否存在]
  let sCount = await mongo.count('codes', {
    code: c,
    $or: [
      { status: 1 }, { expire_time: { '$gte': Date.now() }}
    ]
  });
  if(sCount === 0) {
    return c;
  } else { // 已经存在，重复生成
    return insertCode();
  }
}

// 根据手机号生成验证码
router.get('/code', async (ctx) => {
  let params = ctx.query;
  logger.info('code -- tel: ' + params.tel);
  // 1. 查询该手机号是否存在可用的验证码
  let codeO = await mongo.findOne('codes', {
    tel: params.tel,
    status: 1
  }, {
    sort: [['create_time', -1]],
    projection: { code: 1, status: 1 }
  });
  let c;
  if(codeO && codeO.status === 1) { // 存在可用
    c = codeO.code;
    mongo.upsetById('codes', codeO['_id'], {
      expire_time: Date.now() + 1800000, // 验证码有效期：30分钟
      create_time: Date.now()
    }); // 重新更新数据库中的有效时间
  } else {
    // 1. 生成验证码
    c = await insertCode();
    // 2. 生成成功后，往数据库中，插入验证码数据
    mongo.insert('codes', {
      code: c,
      tel: params.tel,
      expire_time: Date.now() + 1800000, // 验证码有效期：30分钟
      status: 1,
      create_time: Date.now()
    });
  }
  logger.debug(params.tel + ' code: ' + c);
  tlssms(params.tel, c); // 发送验证码
  ctx.body = 'success';
});

// 注册, tel,code,password
router.post('/regist', async (ctx) => {
  let params = ctx.request.body;
  logger.info('regist params: ', params);
  // 验证输入的验证码, 是否正确
  let c = await mongo.findOne('codes', {
    tel: params.tel,
    code: params.code,
    status: 1,
    expire_time: { '$gte': Date.now() }
  }, {
    sort: [['create_time', -1]]
  });
  if (c) { // 输入的验证码有效
    // 重置验证码状态为已使用
    mongo.upsetById('codes', c['_id'], {status: 0});
    // 对密码进行加盐加密
    let pass = await bcrypt.hash(params.password, saltRounds);
    try {
      await mongo.insert('users', { tel:params.tel,password: pass,create_time:Date.now(),update_time:0 });
      ctx.redirect('/workstation/login_page');
    } catch (e) {
      logger.error(e);
      ctx.redirect(`/workstation/login_page?page=regist&flag=1&tel=${params.tel}`);
    }
  } else {
    ctx.redirect(`/workstation/login_page?page=regist&flag=0&tel=${params.tel}`);
  }
});

// 密码重置, tel,password
router.post('/reset', async (ctx) => {
  let params = ctx.request.body;
  logger.info('reset params: ', params);
  // 验证输入的验证码, 是否正确
  let c = await mongo.findOne('codes', {
    tel: params.tel,
    code: params.code,
    status: 1,
    expire_time: { '$gte': Date.now() }
  }, {
    sort: [['create_time', -1]]
  });
  if (c) { // 输入的验证码有效
    // 重置验证码状态为已使用
    mongo.upsetById('codes', c['_id'], {status: 0});
    // 对密码进行加盐加密
    let password = await bcrypt.hash(params.password, saltRounds);
    // 根据手机号, 修改密码
    let u = await mongo.upset('users', {tel: params.tel}, {password,update_time:Date.now()});
    logger.debug(u.modifiedCount);
    if (u.modifiedCount === 1) { // 重置成功
      ctx.redirect('/workstation/login_page');
    } else { // 重置失败, 手机号错误
      ctx.redirect(`/workstation/login_page?page=reset&flag=2&tel=${params.tel}`);
    }
  } else {
    ctx.redirect(`/workstation/login_page?page=reset&flag=0&tel=${params.tel}`);
  }
});

// 登录, tel,password
router.post('/login', async (ctx) => {
  let params = ctx.request.body;
  logger.info('login params: ', params);
  //  根据手机号, 获取数据库密码hash
  let user = await mongo.findOne('users', {tel:params.tel});
  if (user) {
    let match = await bcrypt.compare(params.password, user.password);
    if (match === true) { // 登录成功
      // 缓存登录态到 session
      ctx.session.tel = params.tel;
      // 缓存登录状态到 cookie 中, 允许自动登录
      ctx.cookies.set('wsSignTel', params.tel, {
        maxAge: 172800000, // 有效时间(s) -- 172800s = 2天
        expires: new Date(Date.now() + 172800000)
      });
      ctx.redirect('/workstation');
    } else { // 登录失败, 密码错误
      ctx.redirect(`/workstation/login_page?flag=3&tel=${params.tel}`);
    }
  } else { // 手机号错误
    ctx.redirect(`/workstation/login_page?flag=2&tel=${params.tel}`);
  }
});

// 登出
router.get('/logout', async (ctx) => {
  ctx.session.tel = null;
  ctx.cookies.set('wsSignTel', null);
  ctx.render('login', {
    page: 'login',
    params: { tel: '' },
    error: {}
  });
});

// 渲染登录、注册、密码重置页面
router.get('/login_page', async (ctx) => {
  let params = ctx.query, error;
  switch (params.flag) {
    case '0': // 验证码错误
      error = {
        key: 'code',
        msg: '验证码错误'
      };
      break;
    case '1': // 该手机号已经注册
      error = {
        key: 'tel',
        msg: `手机号${params.tel}已经注册`
      };
      break;
    case '2': // 该手机号尚未注册
      error = {
        key: 'tel',
        msg: `手机号${params.tel}尚未注册`
      };
      break;
    case '3': // 密码错误
      error = {
        key: 'password',
        msg: `密码错误`
      };
      break;
    default:
      error = {};
      break;
  }
  ctx.render('login', {
    page: params.page || 'login',
    params: {
      tel: params.tel || ''
    },
    error: error
  });
});

// 渲染文档页面
router.get('/doc_page', async (ctx) => {
  let tel = ctx.session.tel || ctx.cookies.get('wsSignTel');
  if (tel) {
    ctx.session.tel = tel;
    ctx.render('doc', { tel: ctx.session.tel,curr_page:'doc' }); // 进入首页
  } else { // 登录
    ctx.redirect('/workstation/login_page');
  }
});

router.get('/', async (ctx) => {
  let tel = ctx.session.tel || ctx.cookies.get('wsSignTel');
  if (tel) {
    ctx.session.tel = tel;
    let params = ctx.query;
    let ts = await mongo.find('tactics', {
      tel: ctx.session.tel
    }, {
      projection: { name: 1 }
    });
    let currT = { l: 0 };
    if (ts.length > 0) {
      currT.l = 1;
      let id = params._id || ts[0]._id.toString();
      currT = await mongo.findById('tactics', id, {
        name: 1, code: 1, time: 1, product: 1
      })
    }
    // 查询产品列表
    let products = await mongo.find('products', {});
    ctx.render('index', {
      tel: ctx.session.tel,
      curr_page: 'index',
      t: currT,
      tactics: JSON.stringify(ts),
      tactic: JSON.stringify(currT),
      products: products,
      ps: JSON.stringify(products),
      productName: function(name) {
        return name.replace(/_/g, '.')
      }
    });
  } else { // 登录
    ctx.redirect('/workstation/login_page');
  }
});

module.exports = router;
